/*
 * Copyright the original author or authors.
 * 
 * Licensed under the MOZILLA PUBLIC LICENSE, Version 1.1 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *	  http://www.mozilla.org/MPL/MPL-1.1.html
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.googlecode.milib.data.value {
	import com.googlecode.milib.base.MLBroadcastClass;

	/**
	 * @author Marek Brun
	 */
	public class MLNumberWithRangeValue extends MLBroadcastClass {

		//DATA:	Number //old value
		public function get event_Changed():String{ return 'Changed'; }
		
		private var value:Number;
		private var minValue:Number;
		private var maxValue:Number;

		public function MLNumberWithRangeValue(initValue:Number=0, minValue:Number=Number.MIN_VALUE, maxValue:Number=Number.MAX_VALUE):void {
			this.minValue=minValue;
			this.maxValue=maxValue;
			v=initValue;
			
		}
		
		public function setMinMaxValue(minValue:Number=Number.MIN_VALUE, maxValue:Number=Number.MAX_VALUE):void {
			this.minValue=minValue;
			this.maxValue=maxValue;
			v=v;
		}
		
		override public function getPrivateVariables():Array {
			return [
				['minValue', minValue],				['maxValue', maxValue]
			].concat(super.getPrivateVariables());
		}
		
		/**
		 * @return number from 0 to 1
		 */
		public function getPosition():Number {
			return (value-minValue)/(maxValue-minValue);
		}
		
		public function setPosition(n:Number):void {
			v=minValue+(maxValue-minValue)*n;
		}
		
		public function get v():Number {
			return value;
		}
		
		public function set v(n:Number):void {
			n=Math.max(minValue, Math.min(maxValue, n));
			if(n===value) { return; }
			var oldValue:Number=value;
			value=n;
			broadcastEvent(event_Changed, oldValue);
		}
		
	}
}
